/*
	游戏主要的循环逻辑
	每个场景都会去遍历所有玩家，拿到玩家，在内存中循环去处理怪物的攻击属性
*/
package gameLogic

import (
	"time"
)

var kMinTimeMs uint32 = 100             //最快100ms循环一次
var kDefaultScene string = "SceneFirst" //默认场景

type BaseScene interface {
	Init()
	Timer()
	Logic(uid string, info UserInfo)
}

type GameMainTimer struct {
	allScene map[string](*BaseScene)
}

func (s *GameMainTimer) init() {
	s.allScene = make(map[string](*BaseScene))
}

func (s *GameMainTimer) addScene(sceneName string, scene BaseScene) {
	s.allScene[sceneName] = &scene
	scene.Init()
	go scene.Timer()
}

func (s *GameMainTimer) doTimer() {
	var doTimerCount uint64 = 0
	for {
		//拿出所有玩家，然后取出每个玩家的场景，丢到场景去处理
		allPlayer := GetAllUser()
		for uid, playerInfo := range allPlayer {
			sceneStr := playerInfo.getScene()
			if scene, ok := s.allScene[sceneStr]; ok {
				(*scene).Logic(uid, playerInfo) //进入正式逻辑，更新操作在各自的logic里面去更新
			} else {
				//找不到默认场景则用default场景替代
				sceneStr = kDefaultScene
				playerInfo.CurrentScene = kDefaultScene
				(*s.allScene[sceneStr]).Logic(uid, playerInfo)
			}
		}
		//logrus.Infof("doTimer %d, player size: %d", doTimerCount, len(allPlayer))
		doTimerCount++
		time.Sleep(time.Duration(kMinTimeMs) * time.Millisecond)
	}

}

var GameMainTimerIns GameMainTimer

func init() {
	(&GameMainTimerIns).init()
	//注册不同的场景
	(&GameMainTimerIns).addScene(kDefaultScene, &SceneFirst{})
	//本身开启time,定期捞全部玩家出来，丢到各个场景去处理
	go GameMainTimerIns.doTimer()
}
